#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

//练习：编写代码实现：求一个整数存储在内存中的二进制表示中1的个数
// == 补码的二进制表示中1的个数

//int main()
//{ 
//	//10进制的数字求它的每一位：123  %10  /10
//	//2进制的数求它的每一位：1001  %2  /2
//
//	int num = 10;
//    int count = 0;
//	while (num)
//	{
//		if (num % 2 == 1)
//		{
//            count++;
//		}
//        num /= 2;
//	}
//    printf("%d\n", count);
//	//问题：无法处理负数
//	// -1：11111111111111111111111111111111 - 补码
//	// 
//	//-1 % 2 == -1
//	//-1 / 2 == 0  循环终止
//
//	return 0;
//}



//int main()
//{
//	int num = 0;
//    scanf("%d", &num);
//	int count = 0;
//
//    //while (num)
//    //{
//    //    if (num & 1)
//    //    {
//    //        count++;
//    //    }
//    //    num >>= 1;
//    //}
//
//	for (int i = 0; i < 32; i++) //缺点：只能处理32位
//    {
//        if (((num >> i) & 1) == 1)
//        {
//            count++;
//        }
//        
//    }
//	
//	//for (int i = 0; i < 32; i++)
//	//{
//	//	if (num & (1 << i))
//	//	{
//	//		count++;
//	//	}
//	//}
//    printf("%d\n", count);
//
//	return 0;
//}



//还有高手 ?
//神奇的妙妙工具：n = n & (n - 1)
//int main()
//{
//	int num = 0;
//    scanf("%d", &num);
//	int count = 0;
//	while (num)
//	{
//		num = num & (num - 1);
//		count++;
//	}
//	printf("%d\n", count);
//
//	return 0;
//}
// n = 13
// n   = 1101
// n-1 = 1100
// n   = 1100 //每次都减少一个1
// n-1 = 1011
// n   = 1000
// n-1 = 0111
// n   = 0000
//

//应用：判断一个数是否是2的幂（2的次方数）
//int main()
//{
//	int num = 0;
//    scanf("%d", &num);
//	if (num && !(num & (num - 1)))//需要注意0的情况
//	{
//		printf("是2的幂\n");
//	}
//	else
//	{
//		printf("不是2的幂\n");
//	}
//
//	return 0;
//}